<!DOCTYPE html>
<html  lang="zh" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!--360浏览器优先以webkit内核解析-->
    <title>api开放介绍</title>
    <link rel="shortcut icon" href="favicon.ico">
    <link href="../static/css/bootstrap.min.css" th:href="@{/css/bootstrap.min.css}" rel="stylesheet"/>
    <link href="../static/css/font-awesome.min.css" th:href="@{/css/font-awesome.min.css}" rel="stylesheet"/>
    <link href="../static/css/main/animate.min.css" th:href="@{/css/main/animate.min.css}" rel="stylesheet"/>
    <link href="../static/css/main/style.min862f.css" th:href="@{/css/main/style.min862f.css}" rel="stylesheet"/>
</head>

<body class="gray-bg">
    <div class="wrapper wrapper-content">
        <div class="row">
            <div class="col-sm-12">
                <div class="ibox float-e-margins">
                    <div class="ibox-title">
                        <h5>项目介绍</h5>
                    </div>
                    <div class="ibox-content no-padding">
                        <div class="panel-body">
                        1、项目基于ruoyi搭建：<a target="_blank" href="http://www.ruoyi.vip">http://www.ruoyi.vip</a>
                       <br/> 2、基于appKey+appSecret的账号
                       <br/> 3、api支持通配符匹配
                        <br/>4、账号权限分配，和api使用限制
                        <br/>5、api后端服务器，加权轮询的负载均衡算法，自动检测服务器可用性
                        <br/>6、api开放平台或外网转内网的转发工具
                        <br/>7、<strong>进入api展示页面 <a href="/api/show">api展示</a></strong>
                    	<br/>8、<strong>进入api测试页面 <a href="/api/test">api测试</a></strong>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        
        <div class="row">
            <div class="col-sm-12">
                <div class="ibox float-e-margins">
                    <div class="ibox-title">
                        <h5>二次开发</h5>
                    </div>
                    <div class="ibox-content no-padding">
                        <div class="panel-body">
                        1、主要逻辑在<a>com.ruoyi.framework.interceptor.ApiRequestInterceptor</a>（拦截请求）和<a>com.ruoyi.common.utils.http.ApiForwardUtil</a>（请求转发）中
                       <br/> 2、请注意application.yml中的<a>openapi</a>属性
                        <br/>3、为提高效率，为不同域名的服务器添加单独的HttpClient连接池，缓存和工具类在<a>com.ruoyi.common.utils.http.HttpClientUtils</a>中
                        <br/>4、加权轮询的算法的实现放在这个包中：<a>com.ruoyi.common.utils.loadbalance</a>，算法继承了其中的接口<a>ILoadBanlance</a>，使用则通过工具类<a>LoadBanlanceUtil</a>来调用，实现其他的负载均衡算法需实现接口ILoadBanlance
                        <br/>5、服务器可用性自动检查，通过调用ruoyi框架自带的task模块实现，菜单目录为<a>系统监控>定时任务</a>，是通过quartz实现的，检查功能具体在类：<a>com.ruoyi.project.api.task.ApiServerCheck</a>中
                        <br/>6、主要的包：<a>com.ruoyi.project.api</a>，主要的类：<a>ApiServer</a>(服务器)，<a>ApiUrl</a>(api接口)，<a>ApiUrlParam</a>(api接口参数)，<a>ApiAccount</a>(api账号)，<a>AccountApiLimit</a>(api账号权限和调用限制)，<a>ApiRequestRecord</a>(api调用记录)，若实体类注释不全，请查看mysql表中的注释
                    	<br/>7、为加快转发速度，大部分数据使用redis进行缓存，缓存的数据key：<a>com.ruoyi.common.constant.ApiRedisConstants</a>，工具类<a>com.ruoyi.common.utils.RedisUtil</a>，请注意缓存的依赖和更新
                    	<br/>8、项目启动后的初始化逻辑，<a>com.ruoyi.framework.apprinitunner.ApplicationInitRunnerImpl</a>
                    	<br/>9、大部分逻辑存在于上述代码中，具体逻辑请阅读注释，联系方式<a>753095374</a>，或博客主页留言：<a href="https://blog.csdn.net/wokuailewozihao" target="_blank">csdn</a>
                        <br/>10、再次感谢<a target="_blank" href="http://www.ruoyi.vip">RuoYi</a>快速开发框架，框架开发文档：<a target="_blank" href="http://doc.ruoyi.vip/#/">开发文档</a>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <script th:src="@{/js/jquery.min.js}"></script>
    <script th:src="@{/js/bootstrap.min.js}"></script>
    <script th:src="@{/ajax/libs/layer/layer.min.js}"></script>
    <script type="text/javascript">
	    $('#pay-qrcode').click(function(){
	        var html=$(this).html();
	        parent.layer.open({
	            title: false,
	            type: 1,
	            closeBtn:false,
	            shadeClose:true,
	            area: ['600px', 'auto'],
	            content: html
	        });
	    });
    </script>
</body>
</html>
